From eb5a644ce38bb93717f734ce391cd2e359dc5d06 Mon Sep 17 00:00:00 2001 From: "awilliam@xenbuild.aw" Date: Mon, 13 Nov 2006 11:24:30 -0700 Subject: [PATCH] [IA64] Fix xencomm for xm mem-set command This patch saves and restores the hypercall parameter within xencomm. Signed-off-by: Masaki Kanno --- .../arch/ia64/xen/xcom_hcall.c | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/linux-2.6-xen-sparse/arch/ia64/xen/xcom_hcall.c b/linux-2.6-xen-sparse/arch/ia64/xen/xcom_hcall.c index 01842ba34a..fda0a45ec5 100644 --- a/linux-2.6-xen-sparse/arch/ia64/xen/xcom_hcall.c +++ b/linux-2.6-xen-sparse/arch/ia64/xen/xcom_hcall.c @@ -221,10 +221,17 @@ xencommize_memory_reservation (xen_memory_reservation_t *mop) int xencomm_hypercall_memory_op(unsigned int cmd, void *arg) { + XEN_GUEST_HANDLE(xen_pfn_t) extent_start_va[2]; + xen_memory_reservation_t *xmr = NULL, *xme_in = NULL, *xme_out = NULL; + int rc; + switch (cmd) { case XENMEM_increase_reservation: case XENMEM_decrease_reservation: case XENMEM_populate_physmap: + xmr = (xen_memory_reservation_t *)arg; + xen_guest_handle(extent_start_va[0]) = + xen_guest_handle(xmr->extent_start); xencommize_memory_reservation((xen_memory_reservation_t *)arg); break; @@ -232,6 +239,12 @@ xencomm_hypercall_memory_op(unsigned int cmd, void *arg) break; case XENMEM_exchange: + xme_in = &((xen_memory_exchange_t *)arg)->in; + xme_out = &((xen_memory_exchange_t *)arg)->out; + xen_guest_handle(extent_start_va[0]) = + xen_guest_handle(xme_in->extent_start); + xen_guest_handle(extent_start_va[1]) = + xen_guest_handle(xme_out->extent_start); xencommize_memory_reservation (&((xen_memory_exchange_t *)arg)->in); xencommize_memory_reservation @@ -243,8 +256,25 @@ xencomm_hypercall_memory_op(unsigned int cmd, void *arg) return -ENOSYS; } - return xencomm_arch_hypercall_memory_op - (cmd, xencomm_create_inline(arg)); + rc = xencomm_arch_hypercall_memory_op(cmd, xencomm_create_inline(arg)); + + switch (cmd) { + case XENMEM_increase_reservation: + case XENMEM_decrease_reservation: + case XENMEM_populate_physmap: + xen_guest_handle(xmr->extent_start) = + xen_guest_handle(extent_start_va[0]); + break; + + case XENMEM_exchange: + xen_guest_handle(xme_in->extent_start) = + xen_guest_handle(extent_start_va[0]); + xen_guest_handle(xme_out->extent_start) = + xen_guest_handle(extent_start_va[1]); + break; + } + + return rc; } unsigned long -- 2.30.2